from django.db import models
from django.core.validators import MinLengthValidator # cahrfield 没有Minlenth校验

from utils.models import ModelBase
# Create your models here.
#新闻的标签表
#新闻表
#新闻评论表
#热门新闻表
#轮播图关联新闻表
class Tag(ModelBase):
    """
    create news tag model
    新闻的标签表
    """
    name = models.CharField(max_length=64,verbose_name="标签名",help_text="标签名")

    class Meta:
        ordering = ['-update_time','-id']#排序 优先级
        db_table = "tb_tag" #指明数据库表名
        verbose_name = "新闻标签" #在admin站点中显示的名称
        verbose_name_plural = verbose_name #显示的复数名称

class News(ModelBase):
    '''
    create news models
    创建新闻表
    '''
    title = models.CharField(max_length=150,verbose_name="标题",validators=[MinLengthValidator(1),],help_text="标题")#标题
    digest = models.CharField(max_length=200,validators=[MinLengthValidator(1),],verbose_name="摘要",help_text="摘要")#摘要
    content = models.TextField(verbose_name="内容",help_text="内容")#内容
    clicks = models.IntegerField(default=0,verbose_name="点击量",help_text="点击量")#点击数量
    image_url = models.URLField(default="",verbose_name="图片url",help_text="图片url")#图片存储路径

    #on_delete 多为子,一为主
    #CASCADE        删主,子没
    #PROTECT        删主,异常PROTECT
    #SET_NULL       删主,子空
    #SET_DEFAULT    删主,子指定默认
    #SET()          括号里可以是函数，设置为自己定义的东西
    #DO_NOTHING     字面的意思，啥也不干
    tag = models.ForeignKey("Tag",on_delete=models.SET_NULL,null=True) #分类,标签
    author = models.ForeignKey('user.Users',on_delete=models.SET_NULL,null=True) #作者

    class Meta:
        ordering = ['-update_time','-id']#排序 优先级
        db_table = "tb_news" #指明数据库表名
        verbose_name = "新闻" #在admin站点中显示的名称
        verbose_name_plural = verbose_name #显示的复数名称

    def __str__(self):
        return self.title

class Comment(ModelBase):
    '''
    create news commet model
    创建新闻评论表
    '''
    content = models.TextField(verbose_name="内容",help_text="内容")#评论
    author = models.ForeignKey('user.Users', on_delete=models.SET_NULL, null=True)  # 作者
    news = models.ForeignKey('news.News', on_delete=models.CASCADE, null=True)  # 新闻
    parents = models.ForeignKey('self',on_delete=models.CASCADE, null=True,blank=True)#null 数据库可以为空,blank前端可以不传

    class Meta:
        ordering = ['-update_time','-id']#排序 优先级
        db_table = "tb_comments" #指明数据库表名
        verbose_name = "评论" #在admin站点中显示的名称
        verbose_name_plural = verbose_name #显示的复数名称

    # 模型中的序列化操作
    def to_dict_data(self):
        comment_dict = {
            'news_id':self.news_id,
            'content_id':self.id,
            'content':self.content,
            'author':self.author.username,
            'update_time':self.update_time.strftime('%Y年%m月%d日 %H:%M:%S'),
            'parent':self.parents.to_dict_data() if self.parents else None,
        }
        return comment_dict

    def __str__(self):
        return '<评论{}>'.format(self.id)

class HotNews(ModelBase):
    '''
    create hot news model
    创建热门新闻
    '''
    PRI_CHOICES = [
        (1,'第一级'),
        (2,'第二级'),
        (3,'第三级'),]
    #一对一方案\相当于多加一个字段
    news =models.OneToOneField('News',on_delete=models.CASCADE) #新闻
    priority = models.IntegerField(choices=PRI_CHOICES,verbose_name="优先级",help_text="优先级",default=3) #优先级
    class Meta:
        ordering = ['-update_time','-id']#排序 优先级
        db_table = "tb_hotnews" #指明数据库表名
        verbose_name = "热门新闻" #在admin站点中显示的名称
        verbose_name_plural = verbose_name #显示的复数名称
    def __str__(self):
        return '<热点{}>'.format(self.id)

class Banner(ModelBase):
    '''
    create news banner model
    轮播图
    '''
    PRI_CHOICES = [
        (1,'第一级'),
        (2,'第二级'),
        (3,'第三级'),
        (4,'第四级'),
        (5,'第五级'),
        (6,'第六级'),
    ]
    image_url = models.URLField()
    priority = models.IntegerField(
        choices=PRI_CHOICES,default=6,
        verbose_name="优先级",
        help_text="优先级") #优先级
    news = models.OneToOneField('News', on_delete=models.CASCADE)  # 新闻
    class Meta:
        ordering = ['priority','-update_time','-id']#排序 优先级
        db_table = "tb_banner" #指明数据库表名
        verbose_name = "轮播图" #在admin站点中显示的名称
        verbose_name_plural = verbose_name #显示的复数名称
    def __str__(self):
        return '<轮播图{}>'.format(self.id)